home *** CD-ROM | disk | FTP | other *** search
- #include <stdio.h>
- #include <math.h>
- #include <nslib.h>
- #include <pc_inc.h>
-
- static int tw[N], s[2][N], c[N], ex1[N/2], ex2[N/2];
-
-
- void sin_cos( void )
- {
- double p=0, d=3.1415927*2/N;
- int i;
-
- for( i=0; i<N; i++ )
- {
- s[0][i] = (int)(sin( p )*65536);
- s[1][i] = -s[0][i];
- c[i] = (int)(cos( p )*65536);
- tw[i] = 35389 - ( (30146*c[i] +0x8000 ) >> 16 );
- p += d;
- }
- }
-
-
- void bitrev( void )
- {
- int i, j, ii, bit, di=0;
-
- for( i=1; i<N-1; i++ ) /* bit reversal */
- {
- for( j=0, ii=i, bit=0; j<EXN; j++, ii>>=1 )
- {
- bit <<= 1;
- bit |= (ii&1);
- }
- if ( i < bit )
- {
- ex1[di] = i;
- ex2[di++] = bit;
- }
- }
- ex1[di] = 0;
- }
-
-
- void time_window( short *buf )
- {
- int i;
-
- for( i=0; i<N; i++ )
- buf[i] = (short)( ( (int)buf[i] * tw[i] +0x8000 ) >> 16 );
- }
-
-
- /* inv = 0 FFT inv = 1 逆FFT */
- void fft( short *rl, short *im, int inv )
- {
- int i, j, k, j1, j2, tim, lenb=N, numb=1, w;
- short xr, xi, yr, yi;
-
- for( i=0; i<EXN; i++ )
- {
- tim = 0; lenb /= 2;
- for( j=0; j<numb; j++ )
- {
- w = 0;
- for( k=0; k<lenb; k++ )
- {
- j1 = tim+k; j2 = j1+lenb;
- xr = rl[j1]; xi = im[j1];
- yr = rl[j2]; yi = im[j2];
- rl[j1] = xr + yr;
- im[j1] = xi + yi;
- xr = xr - yr;
- xi = xi - yi;
- rl[j2] = (short)( ( (int)xr*c[w] - (int)xi*s[inv][w] +0x8000 )
- >> 16 );
- im[j2] = (short)( ( (int)xr*s[inv][w] + (int)xi*c[w] +0x8000 )
- >> 16 );
- w += numb;
- }
- tim += (lenb*2);
- }
- numb *= 2;
- }
-
- for( i=0; ex1[i]; i++ ) /* bit reversal */
- {
- k = rl[ex1[i]]; rl[ex1[i]] = rl[ex2[i]]; rl[ex2[i]] = k;
- k = im[ex1[i]]; im[ex1[i]] = im[ex2[i]]; im[ex2[i]] = k;
- }
-
- for( i=0; i<N; i++ )
- {
- rl[i] /= SQRTN;
- im[i] /= SQRTN;
- }
- }
-